#include "strings/numbers.h"
#include <cstdlib>
#include <cstring>
#include <errno.h>

bool strto32(const char* str, int* i) {
  errno = 0;
  char* endptr;
  long l = strtol(str, &endptr, 10);
  if (errno == EINVAL) return false;
  if (errno == ERANGE) return false;
  if (endptr != str + strlen(str)) return false;
  *i = l;
  return true;
}

bool strto64(const char* str, int64* i) {
  errno = 0;
  char* endptr;
  int64 l = strtoll(str, &endptr, 10);
  if (errno == EINVAL) return false;
  if (errno == ERANGE) return false;
  if (endptr != str + strlen(str)) return false;
  *i = l;
  return true;
}

bool strtod(const char* str, double* d) {
  errno = 0;
  char* endptr;
  double v = strtod(str, &endptr);
  if (errno == EINVAL) return false;
  if (errno == ERANGE) return false;
  if (endptr != str + strlen(str)) return false;
  *d = v;
  return true;
}

bool strto32(const string& str, int* i) {
  return strto32(str.c_str(), i);
}

bool strto64(const string& str, int64* i) {
  return strto64(str.c_str(), i);
}

bool strtod(const string& str, double* d) {
  return strtod(str.c_str(), d);
}

string IntToString(int i) {
  char buffer[100];
  snprintf(buffer, sizeof(buffer), "%d", i);
  return string(buffer);
}
